hhkb
Python

파이썬기초_04_멀티 스레드vs멀티 프로세스

작성자 : Heehyeon Yoo|2025-12-16
# Python# GIL# 멀티 스레드# 멀티 프로세스

1. 동시성 vs 병렬성

비슷해 보이지만 완전히 다른 개념.

  • 동시성 (Concurrency)
    • 논리적 개념: 동시에 실행되는 것처럼 보이는 것.
    • 실제: 작업 간 전환(Context Switching)이 엄청나게 빨라서 동시에 하는 것처럼 느껴짐.
    • 비유: 한 명의 요리사가 칼질하다가, 찌개 끓는 동안 설거지하고, 다시 칼질하는 방식.
  • 병렬성 (Parallelism)
    • 물리적 개념: 실제로 물리적인 시간대에 동시에 실행되는 것.
    • 실제: 멀티 코어(CPU)를 사용하여 진짜로 동시에 작업.
    • 비유: 요리사 두 명이 한 명은 칼질, 한 명은 설거지를 하는 방식.

2. GIL(Global Interpreter Lock)

파이썬(CPython)의 치명적인 제약 사항.

  • GIL이란?
    • Global Interpreter Lock. "글로벌 인터프리터 락".
    • 한 순간에 딱 하나의 스레드만 파이썬 코드를 실행할 수 있도록 막아두는 잠금 장치.
  • 왜 있는가?
    • 파이썬의 메모리 관리(Reference Counting)를 쉽게 하고, 스레드 안전성(Thread-safety)을 확보하기 위해 초기 설계 때 도입됨.
  • 결과:
    • 스레드를 100개를 만들어도, 어차피 한 번에 일하는 놈은 1명뿐임. (나머지 99명은 락이 풀리길 대기)
    • 멀티 코어 CPU가 있어도 스레드 환경에서는 코어 1개만 갈구게 됨.

3. 상황별 사용

A. I/O Bound 작업 (입출력 중심) → Threading 사용

  • 상황: 네트워크 통신(스캐너, 크롤링), 파일 읽기/쓰기, DB 쿼리 등.
  • 특징: CPU가 계산하는 시간보다, 응답을 기다리는 시간(대기)이 훨씬 김.
  • 작동 원리:
    1. 스레드 A가 네트워크 요청을 보냄 → 응답 올 때까지 대기(Sleep).
    2. 이때 스레드 A는 GIL을 내려놓음.
    3. 놀고 있던 스레드 B가 GIL을 잡고 다음 요청을 보냄.
  • 결론: 파이썬 스레드는 대기 시간에 다른 일을 할 수 있으므로 포트 스캐너 제작 시에는 스레딩이 매우 효과적임.

B. CPU Bound 작업 (연산 중심) → Multiprocessing 사용

  • 상황: 암호 해독(Cracking), 이미지 처리, 복잡한 수학 연산, 머신러닝 등.
  • 특징: CPU가 쉴 새 없이 돌아가야 함.
  • 문제점: 스레드를 쓰면 서로 GIL 뺏으려고 싸우느라(Overhead) 오히려 싱글 스레드보다 느려질 수 있음.
  • 해결책: 멀티프로세싱(Multiprocessing) 모듈 사용.
    • 스레드 대신 프로세스(Process)* 여러 개 띄움.
    • 각 프로세스는 별도의 메모리 공간과 별도의 파이썬 인터프리터를 가짐.
    • 즉, 각자 자기만의 GIL을 가지므로 락 경쟁 없이 진짜 병렬 처리가 가능.
  • 결론: 암호 크랙 도구 등을 만들 때는 반드시 멀티프로세싱을 써야 함.